package com.xiaoyu.math;

/**
 * @program: DS_and_A
 * @description: 整数反转
 * @author: YuWenYi
 * @create: 2021-05-10 11:26
 **/
public class ReverseInt {
    //解法一:使用字符串反转:效率太低
    public static int reverse1(int x) {
        boolean lessZero = x < 0;

        String xStr = lessZero ? -x+"" : x+"";

        StringBuilder sb = new StringBuilder(xStr);

        StringBuilder resStr = sb.reverse();

        for (int i = 0; i < resStr.length(); i++) {
            if (resStr.charAt(0) == '0'){
                resStr.deleteCharAt(0);
            }
        }
        try {
            return Integer.parseInt(lessZero ? "-" + resStr.toString() : resStr.toString());
        } catch (NumberFormatException e) {
            return 0;
        }
    }

    /*
    *   1、将12345 % 10 得到5，之后将12345 / 10
        2、将1234 % 10 得到4，再将1234 / 10
        3、将123 % 10 得到3，再将123 / 10
        4、将12 % 10 得到2，再将12 / 10
        5、将1 % 10 得到1，再将1 / 10
    * */
    public static int reverse(int x) {
        int res = 0;
        while (x != 0){
            int mod = x % 10;  //类似于栈的peek

            //判断是否 大于 最大32位整数
            //在res==Integer.MAX_VALUE/10的时候,mod不能大于7,但实际上此时mod<=2,小于7,因此后面必然成立
    /*        if (res>Integer.MAX_VALUE/10 || (res==Integer.MAX_VALUE/10 && mod>7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            //在res==Integer.MIN_VALUE/10的时候,mod不能小于-8,但实际上此时mod只可能等于-1,大于-8,因此后面必然成立
            if (res<Integer.MIN_VALUE/10 || (res==Integer.MIN_VALUE/10 && mod<-8)) {
                return 0;
            }*/

            //由于在res==Integer.MIN_VALUE的时候,mod只可能为-1,即-1463847412,如果首位此时大于1,都报错
            if (res < Integer.MIN_VALUE / 10 || res > Integer.MAX_VALUE / 10) {
                return 0;
            }
            res = res * 10 + mod;  //类似于栈的push
            x/=10;   //类似于栈的pop
        }
        return res;
    }

    public static void main(String[] args) {
        int rev = reverse(-1463847412);
        System.out.println(rev);
    }
}
